package com.xinchao.service;

import com.xinchao.core.exception.ServiceException;
import com.xinchao.model.Area;
import com.xinchao.model.dto.AreaCityDTO;
import com.xinchao.model.dto.AreaDistrictDTO;
import com.xinchao.model.dto.AreaProvinceDTO;
import com.xinchao.model.dto.AreaTreeDTO;
import com.xinchao.model.vo.AreaVO;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * @author dxy
 * @date 2018/8/9 10:25
 */
public interface AreaService {
	/**
	 * 保存省市区
	 *
	 * @param area    Area
	 * @param request HttpServletRequest
	 * @throws ServiceException
	 */
	void saveArea(Area area, HttpServletRequest request) throws ServiceException;

	/**
	 * 修改省市区
	 *
	 * @param area    Area
	 * @param request HttpServletRequest
	 * @throws ServiceException
	 */
	void updateArea(Area area, HttpServletRequest request) throws ServiceException;

	/**
	 * 获取所有的省
	 *
	 * @return List<AreaProvinceDTO>
	 */
	List<AreaProvinceDTO> listAllProvince();

	/**
	 * 通过省编码获取省下面的所有的市
	 *
	 * @param provinceCode 省编码
	 * @return List<AreaCityDTO>
	 */
	List<AreaCityDTO> listCityByProvince(String provinceCode);

	/**
	 * 获取部门的城市列表
	 *
	 * @param departmentId 部门ID
	 * @return List<AreaCityDTO>
	 */
	List<AreaCityDTO> listCityByDeparmentId(Long departmentId);

	/**
	 * 获取所有被选择的城市
	 *
	 * @return List<AreaCityDTO>
	 */
	List<AreaCityDTO> listAllSelectedCity();

	/**
	 * 根据城市编码查找城市被关联的数量
	 *
	 * @param cityCodes 市编码字符串（以逗号分隔）
	 * @return Long
	 */
	Long countSelectedCity(String cityCodes);

	/**
	 * 获取城市的所有行政区
	 *
	 * @param cityCode 城市编码
	 * @return List<AreaDistrictDTO>
	 */
	List<AreaDistrictDTO> listDistrictByCityCode(String cityCode);

    /**
     * 省市区下拉联动查询
     * 参数都为空时，查询所有省份，通过省份查市，通过市查县/区
     *
     * @param province 省
     * @param city     市
     * @return List<AreaVO>
     */
    List<AreaVO> list(String province, String city);

	/**
	 * 获取城市数
	 * @return
	 */
	public  List<AreaTreeDTO> listAllTreeData();

	/**
	 * 根据市编码获取区域
	 * @param cityCode 市编码
	 * @return Area
	 */
	AreaTreeDTO getParentByCityCode(String cityCode);

	List<AreaTreeDTO> listAllTreeDataByDepartmentId(Long departmentId);
}
